/*
 *  arch/arm/include/asm/mach/dma.h
 *
 *  Copyright (C) 1998-2000 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  This header file describes the interface between the generic DMA handler
 *  (dma.c) and the architecture-specific DMA backends (dma-*.c)
 */

struct dma_struct;
typedef struct dma_struct dma_t;

struct dma_ops {
	int (*request) (dmach_t, dma_t *);	/* optional */
	void (*free) (dmach_t, dma_t *);	/* optional */
	void (*enable) (dmach_t, dma_t *);	/* mandatory */
	void (*disable) (dmach_t, dma_t *);	/* mandatory */
	int (*residue) (dmach_t, dma_t *);	/* optional */
	int (*setspeed) (dmach_t, dma_t *, int);	/* optional */
	char *type;
};

struct dma_struct {
	void *addr;		/* single DMA address           */
	unsigned long count;	/* single DMA size              */
	struct scatterlist buf;	/* single DMA                   */
	int sgcount;		/* number of DMA SG             */
	struct scatterlist *sg;	/* DMA Scatter-Gather List      */

	unsigned int active:1;	/* Transfer active              */
	unsigned int invalid:1;	/* Address/Count changed        */

	dmamode_t dma_mode;	/* DMA mode                     */
	int speed;		/* DMA speed                    */

	unsigned int lock;	/* Device is allocated          */
	const char *device_id;	/* Device name                  */

	unsigned int dma_base;	/* Controller base address      */
	int dma_irq;		/* Controller IRQ               */
	struct scatterlist cur_sg;	/* Current controller buffer    */
	unsigned int state;

	struct dma_ops *d_ops;
};

/* Prototype: void arch_dma_init(dma)
 * Purpose  : Initialise architecture specific DMA
 * Params   : dma - pointer to array of DMA structures
 */
extern void arch_dma_init(dma_t * dma);

extern void isa_init_dma(dma_t * dma);
